﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace SuperKit
{
    public class FileContainer {
        public string Container { get; }
        public DirectoryInfo Host { get; }

        public FileContainer(string name, DirectoryInfo host, string targetDir) {
            Host = host;
            if (Kit.IsEmpty(targetDir)) {
                Container = Path.Combine(host.FullName, name);
            } else {
                Container = targetDir;
            }

            if (!Directory.Exists(Container)) {
                Directory.CreateDirectory(Container);
            }
        }

        public string GetPath(FileInfo file) {
            string path = GetContainerPath(file.FullName, Host.FullName, Container);
            Kit.CheckFileDirectory(new FileInfo(path));
            return path;
        }

        public string GetPath(DirectoryInfo dir) {
            string path = GetContainerPath(dir.FullName, Host.FullName, Container);
            Kit.CheckFileDirectory(new FileInfo(path));
            return path;
        }

        /// <summary>
        /// 获取这个文件对应的Dir。比如说一个“ABC/XXX.zip”，这个文件，对应的变成“ABC/XXX”这样的目录
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public string GetDir(FileInfo file, bool create = true) {
            string path = GetContainerPath(file.FullName, Host.FullName, Container);
            string parent = Path.GetDirectoryName(path);
            string dir = Path.GetFileNameWithoutExtension(file.Name);
            DirectoryInfo info = new DirectoryInfo(Path.Combine(parent, dir));
            if (create && info.Exists == false) {
                info.Create();
            }
            return info.FullName;
        }

        /// <summary>
        /// 得到一个当前文件路径在Container中的印射。这个方法是为了保留文件在原来项目中的结构。
        /// </summary>
        /// <param name="file">要移动的文件</param>
        /// <param name="root">做为判断基准的父目录，file与此目录相同的部分将被截取。</param>
        /// <param name="container">需要移动到的Container。</param>
        /// <returns>file在container中的完整路径。</returns>
        public static string GetContainerPath(string path, string root, string container) {
            // 得到root以外的目录，这里+1的意思是那个“\”符号要被去掉。
            var ownerPath = path.Substring(root.Length + 1);
            return Path.Combine(container, ownerPath);
        }


    }
}
